/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package src;

import java.util.*;
import javax.ejb.EJB;
import javax.ejb.Remove;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import src.util.JsfUtil;


/**
 *
 * @author Juan
 */
@ManagedBean
@SessionScoped
public class CarritoController {
    
    @EJB
    private src.ProductosFacade ejbProductoFacade;
    @EJB
    private src.UsuariosFacade ejbUsuariosFacade;
    @EJB
    private src.PedidosFacade ejbPedidosFacade;
    @EJB
    private src.RelPedidosProductosFacade ejbRelPedidosProductosFacade;
    private int item;
    private int quantity;
    private boolean hayElementos;
    private ArrayList<Productos> listaCarrito;
    private ArrayList<Integer> cantidades;
    private double precioTotal;
    private String tipoPago;

    public String getTipoPago() {
        return tipoPago;
    }

    public void setTipoPago(String tipoPago) {
        this.tipoPago = tipoPago;
    }

    public ArrayList<Integer> getCantidades() {
        return cantidades;
    }

    public double getPrecioTotal() {
        precioTotal = 0;
        if(listaCarrito != null){
            Iterator<Productos> pit = listaCarrito.iterator();
            Iterator<Integer> cit = cantidades.iterator();
            while(pit.hasNext()){
                Productos p = pit.next();
                precioTotal = precioTotal + p.getPrecio()*cit.next();
            }
        }
        return precioTotal;
    }

    public void setPrecioTotal(double precioTotal) {
        this.precioTotal = precioTotal;
    }

    public void setCantidades(ArrayList<Integer> aux) {
        System.out.println("");
    }

    public ArrayList<Productos> getListaCarrito() {
        return listaCarrito;
    }

    public boolean isHayElementos() {
        hayElementos = false;
        if(listaCarrito!= null && listaCarrito.size()>0){
            hayElementos = true;
        }
        return hayElementos;
    }

    public void setHayElementos(boolean hayElementos) {
        hayElementos = false;
        if(listaCarrito!= null && listaCarrito.size()>0){
            hayElementos = true;
        }
    }

    public void setListaCarrito(ArrayList<Productos> listaCarrito) {
        this.listaCarrito = listaCarrito;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }


    public String addItem() {
        if(listaCarrito==null){
            listaCarrito = new ArrayList<Productos>();
            cantidades = new ArrayList<Integer>();
        }
        item= Integer.parseInt((String)FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("param"));
        if(quantity==0){
            quantity=1;
        }
        Productos p =ejbProductoFacade.productoPorId(item);
        
        if(listaCarrito.contains(p)){
           int index=listaCarrito.indexOf(p);
           quantity= quantity + cantidades.get(index);
           cantidades.set(index, quantity);
        }else{
            listaCarrito.add(p);
            cantidades.add(quantity);
        }
        quantity = 0;
        
        return "index";
    }
    
    public void actualizarItem() {
        item= Integer.parseInt((String)FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("param"));
        Productos p =ejbProductoFacade.productoPorId(item);
        try{
            item= Integer.parseInt((String)FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(p.getId()));
            if(quantity==0){
                removeItem();
            }else{
                cantidades.set(listaCarrito.indexOf(p),quantity);
                cantidades.add(quantity);
            }
            quantity = 0;
        }catch(NumberFormatException e){
            JsfUtil.addErrorMessage("En campo de la nueva cantidad debe ser un número entero");
        }
        
    }   
    
    public void removeItem() {
        item= Integer.parseInt((String)FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("param"));
        Productos p =ejbProductoFacade.productoPorId(item);
        int index=listaCarrito.indexOf(p);
        listaCarrito.remove(index);
        cantidades.remove(index);
    }
    
    public void vaciarCarrito(){
        listaCarrito = null;
        cantidades = null;
    }
    
    @Remove
    public String guardarCarrito() {
        realizarRedido("Pendiente");
        vaciarCarrito();
        JsfUtil.addSuccessMessage("Carrito guardado, puede verlo y tramitarlo desde sus pedidos");
        return "index";        
    }
    
    public void realizarRedido(String estado){
        Pedidos ped = new Pedidos();
        System.out.println(ped.getFecha());
        String cuenta= (String)FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("param");
        Usuarios usu = ejbUsuariosFacade.usuarioPorCuenta(cuenta);
        ped.setCuentausuario(usu);
        ped.setTipopago(tipoPago);
        ped.setEstado(estado);
        ejbPedidosFacade.create(ped);
        Iterator<Productos> itp = listaCarrito.iterator();
        Iterator<Integer> itc = cantidades.iterator();
        ArrayList<RelPedidosProductos> col = new ArrayList<RelPedidosProductos>();
        while(itp.hasNext()){
            Productos p = itp.next();
            int c = itc.next();
            if((p.getStock()-c)>0){
                p.setStock(p.getStock()-c);
            }else{
                p.setStock(0);
            }
            ejbProductoFacade.edit(p);
            RelPedidosProductos pp =  new RelPedidosProductos();
            pp.setCantidad(c);
            pp.setPedidos(ped);
            pp.setProductos(p);
            RelPedidosProductosPK pppk = new RelPedidosProductosPK(p.getId(), ped.getId());
            pp.setRelPedidosProductosPK(pppk);
            ejbRelPedidosProductosFacade.create(pp);
            col.add(pp);
        }
        ped.setRelPedidosProductosCollection(col);
        ejbPedidosFacade.edit(ped);
    }

    public String checkout() {
        realizarRedido("Nuevo");
        JsfUtil.addSuccessMessage("Pedido realizado, puede ver su estado desde sus pedidos");
        vaciarCarrito();
        return "index";        
    }
    
    @Remove
    public String cancel() {
        vaciarCarrito();
        JsfUtil.addSuccessMessage("Carrito borrado");
        return "index";
    }
}
